package br.com.usjt.sge.web.bean;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.bean.SessionScoped;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import javax.servlet.http.HttpSession;

import br.com.usjt.sge.complemento.Endereco;
import br.com.usjt.sge.complemento.Telefone;
import br.com.usjt.sge.estacionamento.Estacionamento;
import br.com.usjt.sge.estacionamento.EstacionamentoRN;
import br.com.usjt.sge.reserva.Reserva;
import br.com.usjt.sge.reserva.ReservaRN;
import br.com.usjt.sge.usuario.Usuario;
import br.com.usjt.sge.util.ContextoUtil;
import br.com.usjt.sge.veiculo.Veiculo;
import br.com.usjt.sge.veiculo.VeiculoRN;
import br.com.usjt.sge.web.ContextoBean;

@ManagedBean(name="reservaBean")
@SessionScoped
public class ReservaBean {

	private Estacionamento estacionamento = new Estacionamento();
	private Endereco endereco = new Endereco();
	private Telefone telefoneEstacionamento = new Telefone();
	private List<Veiculo> listaVeiculo = null;
	private List<Reserva> reservasDeUsuario = new ArrayList<Reserva>();
	private List<Reserva> lista = new ArrayList<Reserva>();
	private Reserva reserva = new Reserva();
	private Usuario usuario = new Usuario();
	private Veiculo veiculo = new Veiculo();
	private String detalhar;
	private boolean modal;
	private String numero;
	private String telefone;
	private String endUsuario;
	private String endEstac;
	private String telEstac;
	private String tipo;

	public String reserva() {
		
		int cod_estacionamento = 1;

		ContextoBean contextBean = ContextoUtil.getContextoBean();
		Usuario usuarioLogado = new Usuario();
		usuarioLogado = contextBean.getUsuarioLogado();
		
		
		if (contextBean.getUsuarioLogado() == null) {
			
			return "login";
			
		}
		
		EstacionamentoRN estacionamentoRN = new EstacionamentoRN();
		this.estacionamento = estacionamentoRN.carregar(cod_estacionamento);
		this.endereco = estacionamento.getEndereco();
		this.telefoneEstacionamento = estacionamento.getTelefone();
		this.telEstac = telefoneEstacionamento.getNum_telefone();
		this.endEstac = endereco.getLogradouro() + " " + endereco.getNumero()
				+ " " + endereco.getBairro() + " " + endereco.getCep() + ", "
				+ endereco.getUf();

		this.endereco = null;

		this.usuario = usuarioLogado;
		this.endereco = usuario.getEndereco();
		this.endUsuario = endereco.getLogradouro() + " " + endereco.getNumero()
				+ " " + endereco.getBairro() + " " + endereco.getCep() + ", "
				+ endereco.getUf();
		this.telefone = usuario.getTelefone().getNum_telefone();

		VeiculoRN veiculoRN = new VeiculoRN();
		this.veiculo = veiculoRN.buscarPorUsuario(this.usuario.getCodigo());
		
		this.tipo = ""; 

		return "reserva";
	}

	public String efetuarReserva() {
					
		this.reserva.setSituacao("PENDENTE");
		this.reserva.setTipo(this.tipo);
			
		ReservaRN reservaRN = new ReservaRN();
				
		this.reserva.setUsuario(this.usuario);
		this.reserva.setVeiculo(this.veiculo);
		this.reserva.setEstacionamento(this.estacionamento);
								
		reservaRN.salvar(this.reserva);
		
		this.reservasDeUsuario = null;
		
		return "minhasReservas";

	}

	public String cancelar() {
		/*
		 * Estados de situação de reserva: PENDENTE, ATIVO, CANCELADA,
		 * FINALIZADA;
		 */
		this.reserva.setSituacao("CANCELADA");
		ReservaRN reservaRN = new ReservaRN();
		reservaRN.salvar(this.reserva);

		return null;
	}

	public String excluir() {

		FacesContext context = FacesContext.getCurrentInstance();

		if (this.reserva == null) {

			FacesMessage facesMessage = new FacesMessage(
					FacesMessage.SEVERITY_ERROR, "Localize uma reserva.",
					"Nenhuma reseva para excluir.");
			context.addMessage(null, facesMessage);
			return null;
		}

		ReservaRN reservaRN = new ReservaRN();
		reservaRN.excluir(this.reserva);
		return "meuEstacionamento";

	}
	
	public String reservasPorUsuario() {
				
		ReservaRN reservaRN = new ReservaRN();
		ContextoBean contextBean = ContextoUtil.getContextoBean();
		
		this.reservasDeUsuario = reservaRN.reservasPorUsuario(contextBean.getUsuarioLogado().getCodigo());
		
		return "minhasReservas";
				
	}
	
	public void reservasPorEstacionamento() {
		
		ReservaRN reservaRN = new ReservaRN();
		ContextoBean contextBean = ContextoUtil.getContextoBean();
		
		this.lista = reservaRN.reservasPorUsuario(contextBean.getUsuarioLogado().getCodigo());
		
				
	}
		

	public void detalhar() {

		ReservaRN reservaRN = new ReservaRN();
			
	}

	public List<Veiculo> getListaVeiculo() {

		ContextoBean contextBean = ContextoUtil.getContextoBean();
		Usuario usuarioLogado = new Usuario();
		usuarioLogado = contextBean.getUsuarioLogado();

		this.listaVeiculo = new ArrayList<Veiculo>();
		VeiculoRN veiculoRN = new VeiculoRN();
		listaVeiculo = veiculoRN.listar(usuarioLogado);
		return listaVeiculo;
	}

	public void setVeiculoSelecionado(ValueChangeEvent event) {
		Integer veiculo = (Integer) event.getNewValue();
		VeiculoRN veiculoRN = new VeiculoRN();
		this.veiculo = veiculoRN.carregar(veiculo);

	}

	public List<Reserva> buscarReservaPorNum() {

		ReservaRN reservaRN = new ReservaRN();
		this.reserva = reservaRN.buscarReservaPorNum(this.numero);

		this.lista = null;
		this.lista = new ArrayList<Reserva>();
		lista.add(reserva);

		return lista;
	}

	public List<Reserva> listaReservaEstacionamento() {

		ContextoBean contextBean = ContextoUtil.getContextoBean();
		this.usuario = contextBean.getUsuarioLogado();
		Integer codigo = usuario.getCodigo();

		EstacionamentoRN estacionamentoRN = new EstacionamentoRN();
		this.estacionamento = estacionamentoRN.buscarPorUsuario(codigo);
		// Integer cod_estacionamento = usuario.getCodigo();

		this.lista = new ArrayList<Reserva>();
		ReservaRN reservaRN = new ReservaRN();
		this.lista = reservaRN.listaReserva(estacionamento.getEstacionamento());

		return lista;

	}

	public Endereco getEndereco() {
		return endereco;
	}

	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}

	public Reserva getReserva() {
		return reserva;
	}

	public void setReserva(Reserva reserva) {
		this.reserva = reserva;
	}

	public Estacionamento getEstacionamento() {
		return estacionamento;
	}

	public void setEstacionamento(Estacionamento estacionamento) {
		this.estacionamento = estacionamento;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public Veiculo getVeiculo() {
		return veiculo;
	}

	public void setVeiculo(Veiculo veiculo) {
		this.veiculo = veiculo;
	}

	public String getEndUsuario() {
		return endUsuario;
	}

	public void setEndUsuario(String endUsuario) {
		this.endUsuario = endUsuario;
	}

	public String getEndEstac() {
		return endEstac;
	}

	public void setEndEstac(String endEstac) {
		this.endEstac = endEstac;
	}

	public String getTelEstac() {
		return telEstac;
	}

	public void setTelEstac(String telEstac) {
		this.telEstac = telEstac;
	}

	public Telefone getTelefoneEstacionamento() {
		return telefoneEstacionamento;
	}

	public void setTelefoneEstacionamento(Telefone telefoneEstacionamento) {
		this.telefoneEstacionamento = telefoneEstacionamento;
	}

	public String getDetalhar() {
		return detalhar;
	}

	public void setDetalhar(String detalhar) {
		this.detalhar = detalhar;
	}

	public boolean isModal() {
		return modal;
	}

	public void setModal(boolean modal) {
		this.modal = modal;
	}

	public String getNumero() {
		return numero;
	}

	public void setNumero(String numero) {
		this.numero = numero;
	}

	public String getTelefone() {
		return telefone;
	}

	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}

	public String getTipo() {
		return tipo;
	}

	public void setTipo(String tipo) {
		this.tipo = tipo;
	}

	public List<Reserva> getReservasDeUsuario() {
		return reservasDeUsuario;
	}

	public void setReservasDeUsuario(List<Reserva> reservasDeUsuario) {
		this.reservasDeUsuario = reservasDeUsuario;
	}

	public List<Reserva> getLista() {
		return lista;
	}

	public void setLista(List<Reserva> lista) {
		this.lista = lista;
	}

	public void setListaVeiculo(List<Veiculo> listaVeiculo) {
		this.listaVeiculo = listaVeiculo;
	}

}
